#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

//读数据函数
void read_data( int pipes[])
{
  int c;
  int rc;
  
  close( pipes[1] );                  //由于此函数只负责读，因此将写描述关闭(资源宝贵)
  while( (rc = read(pipes[0], &c, 1)) > 0 ){                      //阻塞，等待从管道读取数据
    printf("读pipe数据，并写终端：");
    putchar( c );                              //int 转为 unsiged char 输出到终端
  }

  exit( 0 );
}



//写数据函数
void write_data( int pipes[  ] )
{
  int c;
  int rc;

  close( pipes[0] );                          //关闭读描述字
  
  printf("write num to pipe:");
  while( (c=getchar()) > 0 ){
    printf("write num to pipe:");
    rc = write( pipes[ 1 ], &c, 1 );            //写入管道
    if( rc == -1 ){
      perror ("Parent: write");
      close( pipes[1] );
      exit(1);
    }
  }
 

  close( pipes[ 1 ] );
  exit( 0 );
  
}


int main( int argc, char *argv[  ] )
{
  int pipes[2]; //定义一个数组，用于存储管道的文件描述符
  pid_t pid; //定义一个pid_t类型的变量，用于存储子进程的进程ID
  int rc; //定义一个int类型的变量，用于存储函数返回值

  rc = pipe(pipes);                   //创建管道
  if( rc == -1 ){
    perror( "pipes" ); //输出错误信息
    exit( 1 ); //退出程序
  }

  pid = fork();  //创建子进程
  
  switch( pid ){
  case -1:
    perror( "fork" ); //输出错误信息
    exit( 1 ); //退出程序
  case 0:
    read_data( pipes );                       //相同的pipes
  default:
    write_data( pipes );                      //相同的pipes
  }

  return 0;
}
